// sessionStorage.setItem('username','12456')

// const ue =   sessionStorage.getItem('username')

// console.log(ue)

/**
 *使用单件设计模式
  提供一个外部得访问方法
  通过这个外部的访问方法来得到一个对象的方法
  带static 关键字是静态方法
  静态方法和对象无关，外部对象变量不能调用静态方法和属性
  外部可以通过类名来调用
  静态方法可以访问实例属性或实例方法【对象属性或方法】
 */

/**
 * 何时应该把一个方法定义成静态方法或属性定义为静态属性呢? [ 应用]
 * 答:应用1:单件设计模式【storage 类】就是静态方法和静态属性很好的应用场景之一。 当外部不能创建对象，就只能借助类内部的静态方法来获取类的对象;这时肯定不能把这个方法定义成原型对象属性上的方法，只能定义为类的静态方法，因为如果定义成原型对象属性的方法，就会导致外部无法被访问，因为外部根本不能创建对象，也就无法访问原型对象属性.上的方法。而静态方法要访问的属性就只能是静态属性了，这也是静态属性的应用时机
 * 答:应用2: 当一个类的方法没有使用其他属性方法时就应该封装为 ，静态方法 或者这个类么有任何地方使用或者不必要时使用
 * 答:应用3:一些文件的工具类，比如说fs 只封装为读文件 写文件 没有任何上面关联的，建议使用为静态类
 */




  /**
   * 对象原型(就是类下面的方法)方法没有办法调用对象上面的静态方法
   * 对象属性都是不带关键字的 比如说static 关键字，带了的话就是静态方法 不带就是今天属性 
   * 静态属性和对象属性不能互调，只能 静态属性调用静态数据，动态属性调用动态属性
   * 静态方法不能够访问类中的原型或对象的属性方法
   * 对象变量能够方法对象中得属性和原型  对象变量能够方法类的属性和方法  但对象变量不能方法静态变量和方法 因为静态变量和方法不需要实例化
   * 静态方法或变量是约束外部调用用方式 不会影响内部使用
   * 静态方法和属性方法不能互调用
   * 静态方法改变了某一个静态属性 其他方法访问了这个静态方法或属性这个值都是改变过后的
   * 
   */

  
/**
 * TS 中允许使用 prototype.xxx 去覆盖原有的方法，但是不应许添加方法
 * JS 中可以使用 prototype 添加方法 和覆盖方法 ES5之前 使用prototype添加属性和方法
 * 
 */

 // 静态成员 保存在内存中的静态区中的，运行一个ts类，ts 首先会为静态成员开辟内存空间，静态成员内存空间分配时间要早于对象空间分配   无论是否创建对象或者是创建多个对象，是否调用静态方法 TS都会为这个静态方法或属性分配内存空间
 // 也就是任意一个对象创建之前TS就为静态成员分配好了内存空间，但是一个静态方法只会分配一个空间，**只要墙服务器不重启或者程序没有停止，那么静态方法都会存在内存空间，无论调用多少次都是调用的同一块内存空间**

  class testStatic {
    static cont:any='';

    public MaxCont!:number;


    // 求和
  public static  addUp(){
    // 这里能调用静态方法的所有属性
    /**
     * Object 这个方法能够点出来很多 比如说Object.keys,Object.values.....
     * 
     * 比如 let Obje = {name:'zixia',sex:178}
     *    Object.keys( Obje )
     */
     this.cont = !this.isNAN() ? this.cont *10 : 0;
      
    }

  public static isNAN(){
    // 静态方法能调用类中的所有静态方法 和静态属性
    // 比如这里能调用本身 以及求和 addUp 方法 以及今天方法 cont
    return isNaN(this.cont)
  }
  public static getCont(){
    return this.cont
  }

  // 方法类中的共有属性
  public listMax(){
    // this. 可以调用 自身 和 公有属性 MaxCont
  }

}
testStatic.addUp()
console.log(testStatic.getCont())
testStatic.addUp()
console.log(testStatic.getCont())
testStatic.addUp()
console.log(testStatic.getCont())


  // 单件式设计模式
  export default class storage{
    static isStorage:storage
    // 一个私有得实例方法 外部不能被调用 只能在类里面调用
     private constructor(){
      console.log(`调用了实例方法`)
    }

    /**
     * 
     * @returns storage
     */
    public static getInstance(){
      console.log('调用之前的类',this.isStorage)
      if(!this.isStorage){
        this.isStorage = new storage()
      }
      console.log('调用之后的类',this.isStorage)
      return this.isStorage
    }

  }

// 饿汉单件模式 一开始都创建这个唯一的对象


class MyLocalStorage {
  // 对象属性 【对象的基本类型属性和对象的引用属性】
  // 静态属性 【静态的基本类属性和静态的引用属性】
  static LocalStorage = new MyLocalStorage()
  public getItem(key: string):any{
    return sessionStorage.getItem(key)
  }

  public setItem(key: string, value: any){
    sessionStorage.setItem(key,value)
  }
}

MyLocalStorage.LocalStorage.getItem(``)